from faker import Faker
from random import randint
from datetime import datetime
faker = Faker(locale='zh_cn')
# 作业：
# 1、编写一个学生方法，产生一堆学生对象（姓名），传入形参控制学生生成数量
def stufunc(num:int)->list:
    result = []     # 设置一个空的列表，用于新增学生对象
    for i in range(num):
        result.append(faker.name() + "\n")
    with open('stu.txt','w',encoding='utf-8') as f:
        f.writelines(result)
    with open('stu.txt','r',encoding='utf-8') as f:
        all_lines = f.readlines()
    return all_lines

# print(stufunc(10))


# 2、创建一个方法，用来生成普通人必备的信息：姓名、年龄、住址、身份证号、手机号，随机生成20个写入personinfo.txt里
# 格式：姓名：xxx  年龄：xxx 住址：xxx 身份证号：xxx
def personFunc(num=20):
    result = []
    for i in range(num):
        str_obj = f"学生姓名是：{faker.name()}，年龄是：{str(randint(18,99))},住址是：{faker.address()}，" \
                  f"身份证号是：{faker.ssn(min_age=18,max_age=99)}，手机号码是：{faker.phone_number()}" + "\n"
        result.append(str_obj)
    with open('personinfo.txt','a',encoding='utf-8') as f:
        f.writelines(result)
# personFunc()

# 3、文本 student.txt中包含下面的内容
# zhangshan:30
# lisi:50
# wangwu:60
# lifei:70
# 期望能够统计出其中的内容，以dict的形式保存，
# 例如： {"zhangshan":30,"lisi":50,"wangwu":60,"lifei":70}
def student()->dict:
    result = {}
    with open('student.txt','w',encoding='utf-8') as f:
        f.write("zhangshan:30\nlisi:50\nwangwu:60\nlifei:70")
    with open('student.txt','r',encoding='utf-8') as f:
        for line in f.readlines():
            line = line.strip()        # 去除最后的换行符
            line_ele = line.split(':')     # ['zhangshan','30']
            result[line_ele[0]] = int(line_ele[1])
    return result

# print(student())

# 4、给你一个 非空 整数数组 nums ，除了某个元素只出现一次以外，其余每个元素均出现两次。找出那个只出现了一次的元素
def list_(nums:list):
    for i in nums:
        if nums.count(i) == 1:
            return i

# print(list_([11, 22, 11, 22, 33, 44, 55, 33, 44]))

# 5、输入：["1","a","b","3","5","8","_"] 想要提取里面得数字，并保存到一个列表中
def getInt(nums:list)->list:
    result = []
    for i in nums:
        if i in "0123456789":
            result.append(i)
    return result
# print(getInt(["1", "a", "b", "3", "5", "8", "_"]))
# 6、写函数,函数接收的4个参数分别是:姓名,性别(默认为男),年龄,地址
# 用户通过input输入这4个内容(支持持续输入,Q或q退出),并传递给函数，函数接收到这些内容,将其追加到student_msg文件中
def personInfo(name,age,address,sex):
    with open('student_msg.txt','a',encoding='utf-8') as f:
        f.write(f"姓名是：{name}，性别为：{sex}，年龄：{age}，住址是：{address}\n")
    print("添加成功！")
"""
# 引导用户手动输入个人信息
while True:
    name = input("请输入姓名：")
    if name == 'Q' or name == 'q':
        print("停止收集")
        break
    sex = input("请输入性别：")
    if sex == 'Q' or sex == 'q':
        print("停止收集")
        break
    if sex:
        pass
    else:
        sex = '男'
    age = input("请输入年龄：")
    if age == 'Q' or age == 'q':
        print("停止收集")
        break
    address = input("请输入地址：")
    if address == 'Q' or address == 'q':
        print("停止收集")
        break
    personInfo(name,age,address,sex)
"""






# 7、打印功能菜单、添加学生信息、删除学生信息、修改学生信息、显示学生信息、退出系统，并且需要接收用户的输入，在根据输入内容调用相应函数实现相应功能（存入文件），模板图如下。每次对学生管理系统发生改动，要写入改动点到log.txt文本中
def stuSystem():
    while True:
        print("欢迎您来到学生管理系统！")
        print("功能菜单如下：")
        print("①添加学生信息：")
        print("②删除学生信息：")
        print("③修改学生信息：")
        print("④显示学生信息：")
        print("⑤退出学生系统：")
        r = input("请输入您要操作的序号：")
        if r == '1':
            name = input("请输入要添加的学生姓名：")
            with open('stuSystem.txt','r',encoding='utf-8') as f:
                all_lines = f.readlines()
            if all_lines:       # 判断这个文件是不是空的，不是空的，再去判断是不是有添加过相同的学生信息
                target = False
                for line in all_lines:      # 遍历这个文件每一行内容
                    if f"学生姓名为：{name}" in line.strip():     # 将每一行的内容去除换行符
                        target = True       # 如果说有存在相同的学生姓名，则标记为True
                if target:
                    with open('log.txt','a',encoding='utf-8') as f:
                        f.write(f"当前时间为：{datetime.now()}。您要添加的学生姓名：%s，已经存在了，新增失败！\n"%name)


                    print("您要添加的学生姓名：%s，已经存在了，新增失败！"%name)
                else:
                    age = input("请输入要添加的学生年龄：")
                    address = input("请输入要添加的学生地址：")
                    phone = input("请输入要添加的学生手机号码：")
                    with open('stuSystem.txt', 'a', encoding='utf-8') as f:
                        f.write(f"学生姓名为：{name}，学生地址是：{address}，学生手机号码是：{phone}，学生年龄为：{age}\n")
                    with open('log.txt','a',encoding='utf-8') as f:
                        f.write(f"当前时间为：{datetime.now()}。学生姓名为：{name}，学生地址是：{address}，学生手机号码是：{phone}，学生年龄为：{age}，新增成功！\n")
                    print(f"当前时间为：{datetime.now()}。学生姓名为：{name}，学生地址是：{address}，学生手机号码是：{phone}，学生年龄为：{age}，新增成功！")
            else:       # 如果是空的，直接增加就行了
                age = input("请输入要添加的学生年龄：")
                address = input("请输入要添加的学生地址：")
                phone = input("请输入要添加的学生手机号码：")
                with open('stuSystem.txt','a',encoding='utf-8') as f:
                    f.write(f"学生姓名为：{name}，学生地址是：{address}，学生手机号码是：{phone}，学生年龄为：{age}\n")
                with open('log.txt', 'a', encoding='utf-8') as f:
                    f.write(f"当前时间为：{datetime.now()}。学生姓名为：{name}，学生地址是：{address}，学生手机号码是：{phone}，学生年龄为：{age}，新增成功！\n")
                print(f"学生姓名为：{name}，学生地址是：{address}，学生手机号码是：{phone}，学生年龄为：{age}，新增成功！")
        elif r == '2':
            result = []     # 收集最后的所有结果
            name = input("请输入要删除的学生姓名：")
            with open('stuSystem.txt','r',encoding='utf-8') as f:
                lines = f.readlines()
            target = False      # 打一个标记
            for i in lines:
                if f"学生姓名为：{name}" in i.strip():
                    target = True
                else:
                    result.append(i)        # 除去这一行内容，其他内容正常添加到列表里
            if target:
                with open('stuSystem.txt','w',encoding='utf-8') as f:
                    f.writelines(result)        # 如果说要删除的对象存在，就把他一次性写文件里面
                with open('log.txt', 'a', encoding='utf-8') as f:
                    f.write(f"当前时间为：{datetime.now()}。您要删除的：{name}已经删除成功！\n")
                print(f"您要删除的：{name}已经删除成功！")
            else:
                with open('log.txt', 'a', encoding='utf-8') as f:
                    f.write(f"当前时间为：{datetime.now()}。您要删除的：{name}不存在，删除失败！\n")
                print(f"您要删除的：{name}不存在，删除失败！")
        elif r== '3':
            result = []  # 收集最后的所有结果
            name = input("请输入要修改的学生姓名：")
            with open('stuSystem.txt', 'r', encoding='utf-8') as f:
                lines = f.readlines()
            target = False  # 打一个标记
            for i in lines:
                if f"学生姓名为：{name}" in i.strip():
                    target = True
                else:
                    result.append(i)  # 除去这一行内容，其他内容正常添加到列表里
            if target:
                new_name = input("请输入新的学生姓名：")
                age = input("请输入要添加的学生年龄：")
                address = input("请输入要添加的学生地址：")
                phone = input("请输入要添加的学生手机号码：")
                result.append(f"学生姓名为：{new_name}，学生地址是：{address}，学生手机号码是：{phone}，学生年龄为：{age}\n")
                with open('stuSystem.txt', 'w', encoding='utf-8') as f:
                    f.writelines(result)  # 如果说要修改的对象存在，就把他一次性写文件里面
                with open('log.txt', 'a', encoding='utf-8') as f:
                    f.write(f"当前时间为：{datetime.now()}。您要修改的：{name}已经修改成功！\n")
                print(f"您要修改的：{name}已经修改成功！")
            else:
                print(f"您要修改的：{name}不存在，修改失败！")
        elif r == '4':      # 显示学生信息
            with open('stuSystem.txt','r',encoding='utf-8') as f:
                all_lines = f.readlines()
            if all_lines:
                for index,line in enumerate(all_lines):
                    print(f"第：{index+1}行的信息为：{line}")
            else:
                print("文件信息是空的，暂时没有任何的学生对象")
        elif r=='5':
            print("欢迎您下次光临学生管理系统！")
            print("再见！")
            break

stuSystem()





# 8、如今的社交软件层出不穷，虽然功能千变万化，但都具有好友管理系统的基本功能，包括添加好友、删除好友、备注好友、展示好友等。下面是一个简单的好友管理系统的功能菜单（存入文件）
# 好友管理系统中有5个功能，每个功能都对应一个序号，用户可根据提示“请输入您的选项”选择序号执行相应的操作，包括：
# 添加好友：用户根据提示“请输入要添加的好友：”输入要添加好友的姓名，添加后会提示“好友添加成功”。
# 删除好友：用户根据提示“请输入删除好友姓名：”输入要删除好友的姓名，删除后提示“删除成功”
# 备注好友：用户根据提示“请输入要修改的好友姓名：”和“请输入修改后的好友姓名：”分别输入修改前和修改后的好友姓名，修改后会提示“备注成功”。
# 展示好友：若用户还没有添加过好友，提示“好友列表为空”，否则返回每个好友的姓名。
# 退出：关闭好友管理系统。
# 本任务要求编写程序，模拟实现如上所述的好友管理系统。
# 文件读取要使用相对路径，确保在任何的电脑、终端都可以运行